【SQL基础】T-SQL数据类型
主要学习T-SQL的数据类型:数值型数据类型,字符型数据类型,临时数据类型,混合型数据类型,附带有VARDECIMAL的DECIMAL存储类型。
1、数值数据类型
数值数据类型用于代表数据。具体看下表:
数据类型 |
详细说明 |
INTEGER |
表示能够用4个字节保存的整数值,范围包括-2,147,483,648(-2~31)至2,147,483,647(2~31-1)。INT是INTEGER的缩写形式。 |
SMALLINT |
表示能够用2个字节保存的整数值,范围从-32768(-2~16)至32767(2~16- 1)。 |
TINYINT |
表示能够用1个字节保存的,零以上的整数值,范围为0至255 |
BIGINT |
表示能够用8个字节保存的整数值。范围为-2~63至2~63-1 |
DECIMAL(p,[s]) |
描述定点直。p(精确度)指定数字个数和假定的小数点s(刻度)数字。DECIMAL值可以用5-17个字节保存,由p值决定字节个数。DEC为DECIMAL的缩写。 |
NUMERIC(p,[s]) |
和DECIMAL相同。 |
REAL |
适用于浮点值。包括正数值和负数值。正数值范围大约为2.23E-308至1..79E+308,负数值为-1.18E-38至-1.18E+38。 |
FLOAT[(p)] |
表示浮点值,如REAL。p定义精确度,即p<25表示单精度(4个字节),p >=25为双倍精密度(8个字节)。 |
MONEY |
表示币值。MONEY值和8字节的DECIMAL值一样。都是小数点后4个数字。 |
SMALLMONEY |
和MONEY数据类型一样,只是用4个字节保存。 |
2、字符型数据类型
字符型数据类型用两种普通形式。它们可以是单字节的字符串,还可以使Unicode字符串。此外,字符串有固定或可变长度。具体看下表:
数据类型 |
说明 |
CHAR[(n)] |
表示单字节,有固定长度的字符创,其中n为字符串内的字符个数。n的最大值为8000。如果省略了n,那么字符串的长度就假定为1。 |
VARCHAR[(n)] |
表示单字节的字符可变长度的字符串(0<n<=8000)。和CHAR数据类型相反,VARCHAR数据值能够在它的实际长度中保存。 |
NCHAR[(n)] |
保存固定长度的Unicode字符。CHAR和NCHAR数据类型之间最主要的区别为NCHAR数据类型的每个字符都可以用2个字节保存。而CHAR数据类型的每个字符只用1个字节的存储空间。因此,NCHAR列中字符的个数最多维4000。 |
NVARCHAR[(n)] |
保存具有可变长度的Unicode字符串。VARCHAR和NVARCHAR数据类型之间的最主要区别为每个NVARCHAR字符都能用2个字节保存。而VARCHAR字符只用1个字节的存储空间。NVARCHAR列中的字符个数最多为4000。 |
注:VARCHAR数据类型和CHAR数据类型基本一样,只有一点不同,如果一个CHAR(n)字符串比n个字符要短,那么其余的字符串就会用空格来填充。VARCHAR数据类型经常用数据长度存储。
3、临时数据类型
T-SQL支持的临时数据类型有:DATETIME、SMALLDATETIME、DATE、TIME、DATETIME2和DETETINEOFFSET。
DATETIME和SMALLDATETIME数据类型指定日期和时间,每个值都为整数并分别用4个字节或2个字节保存。 DATETIME和SMALLDATETIME的值是作为两个单独的数值保存的。DATETIME日期值的范围为01/01/1900至12/31/9999。SMALLDATETIME相应的值为01/01/1900至06/06/2079。时间部分能够再用4个字节或2个字节保存。它表示午夜过后的一秒的三百分之一(DATETIME)或分钟(SMALLDATETIME)。
如果只想保存日期或时间部分,那么使用DATETIME和SMALLDATETIME非常不方便。SQL SERVER 2008新增新的数据类型:DATE和TIME,这两种数据类型只能分别保存DATATIME数据的DATA或TIME部分。DATE数据类型用3个字节的保存并且范围为01/01/0001至12/31/9999。TIME数据类型用3-5个字节保存,且精确到100ns。
DATETIME2数据类型也是一种新的数据类型,用于保存精度度很高的日期和时间数据。这种数据类型能够根据要求定义可变长度。存储大小为6-8个字节。时间部分的精确度为100ns。
4、混合型数据类型
T-SQL的混合数据类型有:Binary,BIT,大对象数据类型,CURSOR,UNIQUEIDENTIFIER,SQL_VARTANT,TABLE,XML,Spatial,HIERARCHYID,TIMESTAMP和自定义数据类型。
4.1 BINARY和BIT
BINARY和VARBINARY数据类型是两种二进制的数据类型。它们表示系统内部格式的数据对象。它们用来存储位串,因此这些值都是十六进制的数字。
数据类型 |
详细说明 |
BINARY[(n)] |
指定有固定长度和n个字节的位串(0<n<=8000) |
VARBINARY[(n)] |
指定一个为串的可变长度,最高值为n个字节(0<n<=8000) |
BIT |
用于指定Boolean数据类型,它包含三个值:TRUE,FALSE和NULL。 |
4.2 大对象数据类型
大对象就是最大长度为2GB的数据对象。这些数据对象一般用来存储大型的文本数据、加载模块和音频/视频文件。T-SQL支持两种不同的指定和访问方式:使用VARCHAR(MAX),NVARCHAR(MAX)和VARBINARY(MAX)的数据类型;使用所谓的文本和图像数据类型。
TEXT、NTEXT和IMAGE数据类型组成了所谓的文本/图像数据类型。IMAGE类型的数据对象包含所有的数据(下载模块、音频/视频),而TEXT和NTEXT数据类型的数据对象包含文本数据。
文本/图像数据类型和数据库的其他值区别保存默认值,存储方式为使用指向该数据字段的B-树型结构。而对于含有文本/图像数据类型的列来说,在数据行中存储了16字节的指示器,指定能找到数据的地方。
如果文本/图像数据小于32KB,指示器就指向了B-树型结构中的根部节点,该节点长度约为84字节。根部节点指向数据的物理模块。如果数据总量大于32KB,Database Engine就会在数据模块和根部节点建立中间节点。由于每个表都包含一个以上的有这种数据的列,列中的所有值都存储在一起。然而,一个物理页面能只包含单个表中的文本/图像数据。
文本/图像数据类型有很多局限性。不能把他们当作本地变量。它们也不能作为索引的一部分,不能用在WHERE、ORDER BY和GROUP BY的子句中。有些时候可以使用VARCHAR(MAX),NVARCHAR(MAX)和VARBINARY(MAX)来代替文本/图像数据类型。
4.3 CURSOR
4.4 UNIQUEIDENTIFIER
UNIQUEIDENTIFIER数据类型值是唯一辨别数字,它是用16个字节存储的二机制字符串,和全球唯一识别码密切相关,保证了在世界范围内的唯一性。因此,通过运用数据类型,可以在分布式的计算机中识别数据和对象。使用NEWID和NEWSEQUUENTIALID函数可以进行列或UNIQUEIDENTIFIER类型的变量初始化,并且字符串常量是用十六进制数字和连字符这种特殊格式书写的。
4.5 SQL_VARTANT
SQL_VARIANT数据类型用于同时存储各种数据类型,如数值、字符串已经日期值等。只有TIMESTAMP类型值不能存储。SQL_VARIANT列中的每个值都有两个部分:日期值和描述值的信息。这些信息包含数据类型的所有属性,如长度、范围和精确度。
4.6 TABLE
4.7 XML
4.8 Spatial
4.9 HIERARCHYID
UNIQUEIDENTIFIER数据类型用于保存整个层面,它是作为CLR自定义数据安装的,包括一些层级节点上的创建和操作的系统函数:GetAncestor(),GetDescendant(),Read()和Wriite().
4.10 TIMESTAMP
TIMESTAMP数据类型指定其中的一栏为VARBINARY(8)和BINARY(8),这是由列中的无效值决定的。系统包含每个数据库的当前值(不是日期或时间),这样在插入或更新含有TIMESTAMP列这样的行就会自动增加。
4.11 自定义数据类型
5 附带有VARDECIMAL的DECIMAL存储类型
Vardecimal 是一种存储格式,而不是数据类型。
vardecimal 存储格式可以大大减少数据的存储大小,但确实增加了少量 CPU 开销。vardecimal 存储格式应用于表级别。也就是说,不能只将表中的某些 decimal 列存储为 vardecimal 存储格式而不将其他列存储为该格式。decimal 数据将保持为本身的数据类型。